package com.huishi.handler;

import java.io.IOException;
import java.nio.file.*;
import java.util.*;
import java.util.stream.Collectors;
import java.util.stream.Stream;

public class FileFilterWithExtensions {
    public static void main(String[] args) throws IOException {
        Path directoryPath = Paths.get("D:\\D_APP\\filesData\\test"); // 设置目录路径
        List<String> targetExtensions = Arrays.asList("dat", "pls","txt"); // 动态给定需要匹配的后缀
        List<Path> filteredFiles;

        // 使用Stream API来遍历目录并过滤指定后缀的文件
        try (Stream<Path> stream = Files.walk(directoryPath, Integer.MAX_VALUE, FileVisitOption.FOLLOW_LINKS)) {
            filteredFiles = stream
                    .filter(path -> Files.isRegularFile(path) && hasMatchingExtension(path, targetExtensions))
                    .collect(Collectors.toList());
        }

        // Map保存文件名（不含后缀），并保存不同后缀的文件路径
        Map<String, List<Path>> fileGroups = new HashMap<>();

        for (Path path : filteredFiles) {
            String fileNameWithoutExtension = getFileNameWithoutExtension(path);
            fileGroups.computeIfAbsent(fileNameWithoutExtension, k -> new ArrayList<>()).add(path);
        }

        // 过滤只包含所有指定后缀成对出现的文件
        List<Path> validFiles = fileGroups.values().stream()
                .filter(list -> containsAllExtensions(list, targetExtensions)) // 确保所有指定后缀都存在
                .flatMap(List::stream)
                .collect(Collectors.toList());

        // 输出成对的文件
        validFiles.forEach(System.out::println);
    }

    // 检查文件是否包含指定的后缀之一
    private static boolean hasMatchingExtension(Path path, List<String> extensions) {
        return extensions.stream().anyMatch(extension -> path.toString().endsWith(extension));
    }

    // 获取文件名（去除后缀部分）
    private static String getFileNameWithoutExtension(Path path) {
        String fileName = path.getFileName().toString();
        int dotIndex = fileName.lastIndexOf(".");
        return (dotIndex == -1) ? fileName : fileName.substring(0, dotIndex);
    }

    // 确保文件列表中包含所有指定的后缀
    private static boolean containsAllExtensions(List<Path> files, List<String> extensions) {
        Set<String> fileExtensions = files.stream()
                .map(path -> path.toString().substring(path.toString().lastIndexOf(".") + 1)) // 获取文件后缀
                .collect(Collectors.toSet());
        return fileExtensions.containsAll(extensions); // 检查是否包含所有指定的后缀
    }
}

